using System;
using System.Reflection;

namespace Agatha.Common.InversionOfControl
{
	public interface IContainer
	{
		void Register(Type componentType, Type implementationType, Lifestyle lifeStyle);
		void Register(Type componentType, Lifestyle lifeStyle);
        void Register(Type componentType,Assembly assembly);
		void Register<TComponent, TImplementation>(Lifestyle lifestyle);
		void RegisterInstance(Type componentType, object instance);
		void RegisterInstance<TComponent>(TComponent instance);

        TComponent Resolve<TComponent>(object component);
		TComponent Resolve<TComponent>();
		object Resolve(Type componentType);

		void Release(object component);
	}
}